๐ [[JavaScript - Event Bubbling VS Event Capturing]]
๋ง์ Element์์ ๋น์ทํ๊ฒ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ ๋ ํ๋์ handler๋ฅผ ์ด์ฉํ์ฌ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ
event.target
๋ก ์ด๋ฒคํธ ๋ฐ์ ์ง์์ง๋ฅผ ์ ์ ์๋ค.
์๋ฅผ ๋ค์ด <table>
์ด ์๊ณ ํ
์ด๋ธ ์
์ ํด๋ฆญํ๋ฉด ์์น ํด์ฃผ๋ ์ด๋ฒคํธ๋ฅผ ๋ฌ๊ณ ์ถ๋ค๊ณ ํ ๋, ๊ฐ๊ฐ ๋ฌ์๋ ๊ต์ฅํ ๋ฒ๊ฑฐ๋กญ๋ค. ์๋์ฒ๋ผ ์ฒ๋ฆฌํ ์ ์์ ๊ฒ์ด๋ค.
let selectedTd
// ํ
์ด๋ธ ์ ์ฒด์ listener๋ฅผ ๋ถ์ฐฉํ๋ค.
table.onclick = function (event) {
let target = event.target // ํด๋ฆญ์ด ๋ฐ์ํ๊ณณ์ด
if (target.tagName != "TD") return // ํ
์ด๋ธ ์
์ด ์๋๋ฉด ์ค์ง
highlight(target) // ๋ง์ผ๋ฉด ์ ๋ฌ
}
function highlight(td) {
if (selectedTd) {
// ์ด๋ฏธ ์์น ๋ ๊ฒ์ด ์์ผ๋ฉด ์ ๊ฑฐ
selectedTd.classList.remove("highlight")
}
selectedTd = td
selectedTd.classList.add("highlight") // target์ด ์
์ด๊ธฐ๋๋ฌธ์ ๊ฑฐ๊ธฐ์ ๋ถ์ฐฉ
}
ํ์ง๋ง ํญ์ ์ ์๋ํ๋ ๊ฒ์ ์๋๋ค. ๋ง์ฝ <td>
๋ด๋ถ์ ๋ค๋ฅธ element๊ฐ ์์ผ๋ฉด event.target
์ด ๋ค๋ฅด๊ฒ ๋์ฌ ๊ฒ์ด๋ค.
์ด๋ด ๋๋ event.target.closest('td')
์ด๋ฐ์์ผ๋ก selector์ ์ผ์นํ๋ ๊ฐ์ฅ ๊ฐ๊น์ด ๋ถ๋ชจ element๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ <table>
์ด ๊ฐ๊ณ ์๋์ง ํ์ธํ๋ฉด ๋๋ค.
<div id="menu">
<button data-action="save">Save</button>
<button data-action="load">Load</button>
<button data-action="search">Search</button>
</div>
<script>
class Menu {
constructor(elem) {
this._elem = elem;
elem.onclick = this.onClick.bind(this); // (*)
}
save() {
alert('saving');
}
load() {
alert('loading');
}
search() {
alert('searching');
}
onClick(event) {
let action = event.target.dataset.action;
if (action) {
this[action]();
}
};
}
new Menu(menu);
</script>